package student.aistar.day16;

import java.lang.reflect.Constructor;

/**
 * 反射调用构造方法 (四)
 */
public class ConstructorDemo {
    public static void main(String[] args) throws Exception {
        //1. 获取class实例
        Class<?> c = Point.class;
        //2. 直接调用java.lang.Class<?>提供的方法 T newInstance();


        try {
            //①调用空参构造的第一种方式
            //反射调用空参构造 - 反射构建对象的实例, 取代了原来的new方式
            //直接带哦用newInstance方法, 默认调用的无参构造
            System.out.println("=====无参构造====");
            Point p = (Point) c.newInstance();//无参...

        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        System.out.println("=======Constructor - api有关系=======");
        //②可变长参数列表
        //1. Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes);

        Constructor<?> c1 = c.getDeclaredConstructor(int.class, String.class);

        //如果该构造方法为私有时, 需要使用setAccessible(true)
        c1.setAccessible(true);
        Point p2 = (Point) c1.newInstance(1, "覃烽");//可变长列表的方法
        System.out.println("====带参构造======");
        //调用带参构造
        System.out.println(p2);//Point{x=1, y='覃烽'}




    }
}
